import java.util.HashMap;
import java.util.Map;

public class Test {
    public int totalFruit(int[] f) {
        /*Map<Integer, Integer> hash = new HashMap<Integer, Integer>();//统计窗口内水果的种类
        int ret = 0;
        for(int left = 0, right = 0; right < f.length; right++) {
            int in = f[right];
            hash.put(in, hash.getOrDefault(in,0) + 1);//进窗口
            while(hash.size() > 2) {
                int out = f[left];
                hash.put(out, hash.get(out) - 1);// 出窗口
                if(hash.get(out) == 0) {
                    hash.remove(out);
                }
                left++;
            }
            //更新结果
            ret = Math.max(ret, right - left + 1);
        }
        return ret;
    }*/


        int n = f.length;
        int[] hash = new int[n + 1]; // 使用数组大小 n+1 更安全，假设水果类型编号在0到n之间
        int ret = 0;
        for (int left = 0, right = 0, kinds = 0; right < n; right++) {
            int in = f[right];
            if (hash[in] == 0) {
                kinds++; // 遇到新种类，种类数增加
            }
            hash[in]++; // 水果进入窗口

            // 当窗口内水果种类超过2种时，需要从左侧移出水果
            while (kinds > 2) {
                int out = f[left];
                hash[out]--; // 水果出窗口
                if (hash[out] == 0) {
                    kinds--; // 如果某种水果数量减到0，种类数减少
                }
                left++; // 无论种类数是否减少，左指针都向右移动
            }
            // 更新最大窗口长度
            ret = Math.max(ret, right - left + 1);
        }
        return ret;
    }
}
